딥러닝 선형회귀 모델을 활용한 공공데이터 분석(선형회귀 모델 응용)
안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다.「딥러닝 선형회귀 모델을 활용한 공공데이터 분석」두 번째 블로그로 이번에는 공공데이터를 분석해 봤습니다. 어려운 부분들은 제외하고, 간단하게 A,B값을 학습시키고 AB값을 통해 C값을 유추해내는 과정을 설명하고자 합니다.
이전에 투고했던 딥러닝에 관한 블로그는 아래 링크를 참고해 주세요
데이터셋
먼저 데이터셋은 코로나 확진자 데이터 셋으로 설정했습니다.(작년 10월 대구 기준)
- A열은 이전 누적 확진자 수
- B열은 일일 확진자 수
- C열은 총 누적 확진자 수
AB값을 통해 C값을 유추해 낼 예정입니다.
데이터셋 설정
먼저 numpy의 loadtxt를 통해서 csv 파일을 불러옵니다. 여기서 로드할 시 에러가 뜨게 되는데「\u」를 인식하지 못하기 때문입니다. 그러면 디렉토리 주소 바로 앞에「r」이라고 써주시면 됩니다.
delimiter는 데이터를 구분하는데 그 기준을「,」로 잡았고, dtype 데이터 타입은 정수형으로 설정했습니다.
x_data에 xy [:,0:-1]값을 집어 넣어줬으며, y_data에는 xy[:,[-1]] 값을 집어 넣어 줬습니다.
출력해 보면 다음과 출력됩니다.
7행 2열의 x_data와 7행 1열의 y_data입니다.
데이터 학습
X에는 placeholder을 써서 나중에 값을 다시 입력받게끔 했고, 배열의 형태는 [None,2]입니다. 위에서 x_data의 열의 개수가 2이기 때문에 2로 잡아줘야 하며, 행의 경우 얼마든지 늘어날 수 있기 때문에 None으로 잡았습니다. Y의 부분도 X와 똑같습니다.
W는 가중치로써 tf.Variable를 써서 텐서 즉 텐서플로우 변수로 선언했고, 2,1형태의 배열로 값을 랜덤하게 할당받습니다. b의 경우에도 마찬가지입니다. L에는 tf.add(tf.matmul(X,W),b)를 통해서 행렬 곱한 값을 넣었고, 다시 Relu함수를 통해서 L에 값을 재차 넣었습니다.
ReLU함수는 입력값이 0보다 작으면 항상 0을, 0보다 크면 입력값 그대로 출력하는 함수입니다. ReLU이외에 Sigmoid도 있는데, Sigmoid의 경우 0과 1.0에 수렴하는 형태를 의미합니다.
다음 그림을 보면 Sigmoid와 ReLU함수의 차이점을 명확히 알 수 있습니다.
그리고 softmax 함수를 통해서 model을 만듭니다. softmax는 입력받은 값들을 0과 1사이의 값으로 모두 정규화하며, 출력값들의 총합은 항상 1이 됩니다. 아래 reduce_mean은 배열의 차원을 제거해서 평균을 구하고, reduce_sum은 배열의 차원을 제거해서 합을 구합니다.
그런 다음 하이퍼시스에 X,W +b 행렬 곱의 값을 집어넣습니다.
비용함수인 코스트 펑션의 값 또한 구합니다.
학습데이터가 주어지면 W와 b의 값을 조정하여 Cost Function의 값을 최소화하며, 이미지에 나와있는 식이 코스트 펑션의 식이라고 보면 되겠습니다.
그리고 옵티마이저는 손실 함수를 최소화하기 위해 Variable를 변경하는데, 여기서 learning_rate를 통해서 학습률을 조정해나가면서 보다 정확한 값을 구할 수 있습니다.
cost의 최소값을 minimize(cost)를 통해서 구해 넣고, 그래프를 초기화하기 위해서
init = tf.global_variables_initializer()를 선언해 줍니다.
그런 다음 세션을 실행시키고, init을 run 합니다. 그리고 3001번 반복을 돌면서 학습을 시켜주는데, train 에는 cost의 최소비용이 들어가 있습니다. 즉 0에 수렴 할수록 정확한 값이라는 의미입니다.
feed_dict로 X에는 x_data, Y에는 y_data 값을 넣어주며 학습시킵니다.
result에는 위 학습한 결과를 바탕으로 X값을 통해 Y값을 유추해 낸 값이 들어가게 됩니다.
x_data[0][0]에는 이전 누적 확진자, x_data[0][1]에는 일일 확진자가 들어가게 되고 해당 데이터를 바탕으로 전체 누적 확진자를 찾아냅니다.
학습 결과
결괏값들을 보면 처음 학습을 시켰을 때는 굉장히 높은 숫자들이 나오는 것을 볼 수 있습니다.
하지만 3001번이나 학습을 하면서 거의 0에 가까워질 때 까지 정확도를 높였습니다.
현재 데이터는
- 일일 확진자 수 6명
- 이전 누적 확진자 수 10702명
총 누적 확진자 수 10708.443으로 정확하게 계산해 낸 것을 볼 수 있습니다.
편차는 0.44 퍼센트입니다.
마지막으로
어떻게 보면 간단하게 누적 확진자를 구할 수 있겠지만, 컴퓨터 스스로 학습을 해서 결괏값을 구해낼 수 있을까? 라는 호기심을 계기로 코로나 확진자 데이터셋을 바탕으로 누적 확진자를 구해봤습니다. 아직 딥러닝에 대한 공부가 부족하기 때문에 설명에 부족한 부분이 많을 거라고 생각합니다만 조금이나마 딥러닝에 관심을 가지고 계신 분들에게 제 글이 도움이 됐으면 좋겠습니다.